import axios from "axios"
import { getItem } from './storage'
import Message from '../components/Message'

let api

if (process.env.NODE_ENV === "development") {
  api = process.env.REACT_APP_DEVLOPMENT_API_URL
} else {
  api = process.env.REACT_APP_PRODUCTION_API_URL
}

const request = axios.create({
  baseURL: api // 基础路径
})

// 控制登录过期的锁
let isRefreshing = false

// 请求拦截器
request.interceptors.request.use(config => {
    // 统一设置用户身份 token
    const user = getItem('user')
    if (user && user.token) {
      if (!config.headers) {
        throw new Error(`Expected 'config' and 'config.headers' not to be undefined`);
      }
      config.headers.Authorization = user.token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(response => {
    // 统一处理响应错误，例如 token 无效、服务端异常等
    const { meta } = response.data

    // 请求成功
    if (meta.status === 200 || meta.status === 201) {
      return response
    }

    // 处理 Token 过期
    if (meta.status === 400) {
      Message("error", meta.msg || '无效token, 请重新登录')
      return Promise.reject(response)
    }

    // 错误情况：比如 token 无效...

    // 统一处理登录过期
    if (meta.status === 410000) {
      if (isRefreshing) return Promise.reject(response)
      isRefreshing = true
      // 在内部消化掉这个业务异常
      return Promise.reject(response)
    }

    // 其它错误给出提示即可，比如 400 参数错误之类的
    Message("error", meta.msg || '请求失败，请稍后重试')
    return Promise.reject(response)
  },
  err => {
    Message("error", err.message || '请求失败，请稍后重试')
    return Promise.reject(err)
  }
)

// export default request
export default (config) => {
  return request(config).then(res => {
    return res.data.data || res.data
  })
}
